package cn.gitee.ffmpeg.processed.utils;


import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Objects;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author xuhainan
 * @date 2022/9/15 15:25
 * @region hefei
 */
@Slf4j
public class ParamVerifyUtil {


    /**
     * 对象是否为True
     *
     * @param value 参数值
     * @param msg   满足条件提示信息
     */
    public static void isTrue(Boolean value, String msg) {
        paramMatchThrow(value, msg, Boolean.TRUE::equals);
    }

    /**
     * 对象是否为False
     *
     * @param value 参数值
     * @param msg   满足条件提示信息
     */
    public static void isFalse(Boolean value, String msg) {
        paramMatchThrow(value, msg, Boolean.FALSE::equals);
    }

    /**
     * 对象是否为空
     *
     * @param value 参数值
     * @param msg   提示信息
     */
    public static void objectIsNull(Object value, String msg) {
        paramMatchThrow(value, msg, Objects::isNull);
    }

    public static void objectIsNull(Object value, Supplier<? extends Exception> exceptionSupplier) {
        paramMatchThrow(value, exceptionSupplier, Objects::isNull);
    }

    /**
     * 字符串是否为空
     *
     * @param value 参数值
     * @param msg   提示信息
     */
    public static void stringIsBlack(String value, String msg) {
        paramMatchThrow(value, msg, StrUtil::isBlank);
    }

    /**
     * 校验是否满足单个条件，符合条件抛出异常
     *
     * @param value     校验的值
     * @param msg       提示信息
     * @param predicate 满足条件
     * @param <T>       泛型
     */
    public static <T> void paramMatchThrow(T value, String msg, Predicate<T> predicate) {
        paramAnyMatchThrow(value, msg, predicate);
    }

    public static <T> void paramMatchThrow(T value, Supplier<? extends Exception> exceptionSupplier, Predicate<T> predicate) {
        paramAnyMatchThrow(value, exceptionSupplier, predicate);
    }

    /**
     * 校验是否满足全部条件，符合条件抛出异常
     *
     * @param value    校验的值
     * @param msg      提示信息
     * @param allMatch 满足条件
     * @param <T>      泛型
     */
    @SafeVarargs
    public static <T> void paramAllMatchThrow(T value, String msg, Predicate<T>... allMatch) {
        if (Arrays.stream(allMatch).allMatch(p -> p.test(value))) {
            log.error(msg + "【{}】", value);
            throw new IllegalArgumentException(msg);
        }
    }

    /**
     * 校验是否满足全部条件，符合条件抛出异常
     *
     * @param value    第一个参数
     * @param ualue    第二个参数
     * @param msg      异常信息
     * @param allMatch 匹配条件
     * @param <T>      第一个参数泛型
     * @param <U>      第二个参数泛型
     */
    @SafeVarargs
    public static <T, U> void paramAllMatchThrow(T value, U ualue, String msg, BiPredicate<T, U>... allMatch) {
        if (Arrays.stream(allMatch).allMatch(p -> p.test(value, ualue))) {
            log.error(msg + "【{}】", value);
            throw new IllegalArgumentException(msg);
        }
    }

    /**
     * 校验是否满足全部条件，符合条件抛出异常
     *
     * @param value     第一个参数
     * @param msg       异常信息
     * @param noneMatch 匹配条件
     * @param <T>       第一个参数泛型
     * @param <U>       第二个参数泛型
     */
    @SafeVarargs
    public static <T, U> void paramNoneMatchThrow(T value, String msg, Predicate<T>... noneMatch) {
        if (Arrays.stream(noneMatch).noneMatch(p -> p.test(value))) {
            log.error(msg + "【{}】", value);
            throw new IllegalArgumentException(msg);
        }
    }

    @SafeVarargs
    public static <T> void paramAllMatchThrow(T value, Supplier<? extends Exception> exceptionSupplier, Predicate<T>... allMatch) {
        if (Arrays.stream(allMatch).allMatch(p -> p.test(value))) {
            exceptionSupplier.get();
        }
    }

    /**
     * 校验是否满足任意一个条件，符合条件抛出异常
     *
     * @param value    校验的值
     * @param msg      提示信息
     * @param anyMatch 满足条件
     * @param <T>      泛型
     */
    @SafeVarargs
    public static <T> void paramAnyMatchThrow(T value, String msg, Predicate<T>... anyMatch) {
        if (Arrays.stream(anyMatch).anyMatch(p -> p.test(value))) {
            log.error(msg + "【{}】", value);
            throw new IllegalArgumentException(msg);
        }
    }


    /**
     * 校验是否满足任意一个条件，符合条件抛出异常
     *
     * @param value     校验的值
     * @param operaEnum 提示异常类型
     * @param anyMatch  满足条件
     * @param <T>       泛型
     */
	/*@SafeVarargs
	public static <T> void paramAnyMatchThrow(T value, OperaEnum operaEnum, Predicate<T>... anyMatch) {
		if (Arrays.stream(anyMatch).anyMatch(p -> p.test(value))) {
			log.error(operaEnum.getMsg() + "【{}】", value);
			throw new IllegalArgumentException(operaEnum);
		}
	}*/
    @SafeVarargs
    public static <T> void paramAnyMatchThrow(T value, Supplier<? extends Exception> exceptionSupplier, Predicate<T>... anyMatch) {
        if (Arrays.stream(anyMatch).anyMatch(p -> p.test(value))) {
            exceptionSupplier.get();
        }
    }
}
